package com.huantai.common.util;

import org.apache.commons.lang3.BooleanUtils;

/**
 * Boolean 工具类，封装 {@code org.apache.commons.lang3.BooleanUtils}
 * 
 * @author Ma Chao
 * @version 20180607151253
 */
public final class BooleanUtil {
    /** 不允许使用对象来调用工具类的方法 */
    private BooleanUtil() {}

    /**
     * 只支持把 <code>"true"</code>转换为 <code>true</code> ，其它值返回 <code>false</code>。 其中
     * <code>"true"</code>不区分大小写。
     * 
     * @param str 要转换的String
     * @return <code>true</code> or <code>false</code>
     */
    public static boolean toBoolean(String str) {
        return Boolean.parseBoolean(str);
    }

    /**
     * 只支持把 <code>"true"</code>转换为 <code>true</code>， null 返回 <code>null</code>， 其它值返回
     * <code>false</code>。 其中 <code>"true"</code>不区分大小写。
     * 
     * @param str 要转换的String
     * @return <code>true</code>、<code>null</code>、<code>false</code>
     */
    public static Boolean toBooleanObject(String str) {
        return str != null ? Boolean.valueOf(str) : null;
    }

    /**
     * 仅支持把<code>"true"</code>转换为 <code>true</code>， null 返回默认值， 其它值返回 <code>false</code>。 其中
     * <code>"true"</code>不区分大小写。
     * 
     * @param str 要转换的String
     * @param defaultValue str 为 null 时取的默认值
     * @return <code>true</code>、默认值、<code>false</code>
     */
    public static Boolean toBooleanObject(String str, Boolean defaultValue) {
        return str != null ? Boolean.valueOf(str) : defaultValue;
    }

    /**
     * 支持把<code>"true"</code>、<code>"on"</code>、<code>"yes"</code>、<code>"y"</code>转换为
     * <code>true</code>， 把<code>"false"</code>、<code>"off"</code>、<code>"no"</code>、
     * <code>"n"</code>转换为 <code>false</code>， 其它值返回<code>null</code>。 所有字符不区分大小写。
     * 
     * @param str 要转换的String
     * @return <code>true</code>、<code>false</code>、<code>null</code>
     */
    public static Boolean parseGeneralString(String str) {
        return BooleanUtils.toBooleanObject(str);
    }

    /**
     * 支持把<code>"true"</code>、<code>"on"</code>、<code>"yes"</code>、<code>"y"</code>转换为
     * <code>true</code>， 把<code>"false"</code>、<code>"off"</code>、<code>"no"</code>、
     * <code>"n"</code>转换为 <code>false</code>， 其它值返回默认值。 所有字符不区分大小写。
     * 
     * @param str 要转换的String
     * @param defaultValue str 为其它值时取的默认值
     * @return <code>true</code>、<code>false</code>、默认值
     */
    public static Boolean parseGeneralString(String str, Boolean defaultValue) {
        return BooleanUtils.toBooleanDefaultIfNull(BooleanUtils.toBooleanObject(str), defaultValue);
    }

    /**
     * 取反
     */
    public static boolean negate(final boolean bool) {
        return !bool;
    }

    /**
     * 取反
     */
    public static Boolean negate(final Boolean bool) {
        return BooleanUtils.negate(bool);
    }

    /**
     * 多个值的and运算
     */
    public static boolean and(final boolean... array) {
        return BooleanUtils.and(array);
    }

    /**
     * 多个值的or运算
     */
    public static boolean or(final boolean... array) {
        return BooleanUtils.or(array);
    }
}
